/*              主界面显示              */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#include <stdbool.h>
#include <sys/mman.h>
#include <linux/input.h>

#include "show_bmp.h"
#include "LCD.h"
#include "font.h"
#include "fonts.h"

#include "main_interface.h"

// 主界面显示
int main_interface()
{
    int flag = 0;

    time_thread_running = true;
    int x = -1, y = -1;             // 坐标初始值是-1
    struct input_event touch_event; // 触摸屏数据结构体

    int lcd_fd = open("/dev/fb0", O_RDWR);
    if (lcd_fd < 0)
    {
        perror("Failed to open frame buffer device");
        return -1;
    }
    int(*lcd_mmap)[WIDTH] = (int(*)[WIDTH])mmap(NULL, WIDTH * HEIGHT * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);

    lcd_clear(); // 清屏

    show_bmp("./res/main.bmp", 0, 0); // 主界面背景
    // 图标显示
    show_bmp("./res/board.bmp", 210, 100);
    show_bmp("./res/gallery.bmp", 430, 100);
    show_bmp("./res/exit.bmp", 0, 0);
    show_bmp("./res/2048.bmp", 210, 300);
    // 字体显示
    borad_lcd();

    pthread_t tid;
    pthread_create(&tid, NULL, show_time, NULL); // 创建线程显示时间

    // 打开触摸屏设备文件
    int touch_fd = open("/dev/input/event0", O_RDWR);
    if (touch_fd < 0)
    {
        perror("打开触摸设备失败");
        return -1;
    }
    while (1)
    {

        // 读取触摸屏设备文件数据
        int read_ret = read(touch_fd, &touch_event, sizeof(struct input_event));
        if (read_ret < 0)
        {
            perror("读取触摸事件失败");
            return -1;
        }
        // 获取每次触摸坐标
        if (touch_event.type == EV_ABS)
        {
            switch (touch_event.code)
            {
            case ABS_X:
                x = touch_event.value;
                break;
            case ABS_Y:
                y = touch_event.value;
                break;
            }
        }
        // 根据触摸坐标选择对应功能
        if (touch_event.type == EV_KEY)
        {
            if (touch_event.code == BTN_TOUCH && touch_event.value == 0)
            {
                // printf("触摸坐标(%d,%d)\n", x, y);
                if (x > 210 && y > 100 && x < 290 && y < 180)
                {
                    flag = 1;
                    goto close;
                }
                else if (x > 430 && y > 100 && x < 510 && y < 180)
                {
                    flag = 2;
                    goto close;
                }
                else if (x > 210 && y > 300 && x < 290 && y < 380)
                {
                    flag = 3;
                    goto close;
                }

                else if (y <= 40 && x <= 40)
                {
                    goto close;
                }
            }
        }
    }
close:
    printf("退出主界面\n");
    munmap(lcd_mmap, WIDTH * HEIGHT * 4); // 解除映射
    close(lcd_fd);                        // 关闭文件

    time_thread_running = false; // 设置退出标志
    pthread_join(tid, NULL);     // 等待线程结束
    return flag;
}
